#include "http_server.hpp"
#include "http_protocol.hpp"
#include"session.hpp"
#include <memory>
#include<unordered_map>
#include <iostream>
// 以二进制的形式

std::string SuffixToType(const std::string &suffix)
{
    if (suffix == ".html" || suffix == ".html")
        return "text/html";
    else if (suffix == ".png")
        return "image/png";
    else if (suffix == ".jpg")
        return "image/jpeg";
    else
    {
        return "text/html";
    }
}
void InitStatusMap(std::unordered_map<int, std::string> &map)
{
    // 从文件中获取字符串数组
    std::ifstream in("code_to_desc.txt");
    std::string line;
    std::vector<std::string> lines;
    while (std::getline(in, line))
    {
        lines.push_back(line);
    }
    in.close();
    // 将字符串分割
    for (auto &e : lines)
    {
        auto pos = e.find(" ");
        if (pos == std::string::npos)
        {
            continue;
        }
        else
        {
            int status_code = std::stoi(e.substr(0, pos));
            std::string status_desc = e.substr(pos + 1);
            map[status_code] = status_desc;
        }
    }
}
std::string HandlerRequest(std::string &request)
{
    // 处理请求
    HttpRequest req;
    req.Deserialize(request);
    req.Prase();

    // 响应的有效载荷
    std::string content = req.GetFileContent();

    // 设置一个哈希表---key是状态码 value状态描述
    std::unordered_map<int, std::string> status_map;
    InitStatusMap(status_map);

    // 获得响应
    HttpResponse resp;
    int status_code = 200;
    if (content.empty() == false)
    {
        // 提供的几个Set函数，根据具体情况实现内容
        // if else 在什么情况下 status_code对应的内容是什么

        status_code = 200; // 表示正常

        // 默认需要参数
        resp.SetHeaders("Content-Length: " + std::to_string(content.size()) + "\r\n");
        resp.SetHeaders("Content-Type: " + SuffixToType(req.Suffix()) + "\r\n");
    }
    else
    {
        status_code = 404;
        content = req.Get404Content(); // 为空的话需要对内容特殊处理
    }

    // 业务处理
    if(req.URL() == "/register")
    {

    }
    if(req.URL() == "/login")
    {

    }


    resp.SetCode(status_code);
    resp.SetDesc(status_map[status_code]);
    resp.SetContent(content); // 默认需要通过SetContent添加content
    resp.Make();              // 设置http响应的结构：

    return resp.Serialize(); // 将响应结构序列化返回
}
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage: " << argv[0] << " port" << std::endl;
    }
    uint16_t port = std::stoi(argv[1]);
    std::unique_ptr<HttpServer> ts = std::make_unique<HttpServer>(port, HandlerRequest);
    ts->Init();
    ts->Start();
}